// 在Node中，每个模块内部都有一个自己的module对象
// 该module对象中有一个成员叫exports,也是一个对象
// 也就是说如果你需要对外导出成员，只需要把导出的成员挂载到module.exports中

// 我们发现，每次导出接口成员的时候都通过module.exports.xxx = xxx 的方式很麻烦，点儿的太多了
// 所以，Node为了简化你的操作，专门提供了一个变量: exports = module.exports

// var module = {
//     exports: {
//         foo: 'bar',
//         add: function     
//     }
// }

// 也就是说在模块中还有这么一句代码
// var exports = module.exports

// module.exports.foo = 'bar'
// module.exports.a = 1


// module.exports.add = function (x, y) {
//     return x + y
// }

// 两者一致，那就说明，我可以使用任意一方来导出接口成员
// console.log(exports === module.exports)
// exports.foo = 'bar'
// module.exports.add = function (x, y) {
//     return x + y
// }

// 从上面可以看出  exports 是 module.exports的一个引用
// console.log(exports === module.exports) // true
// exports.foo = 'bar'
// // 等价于
// module.exports.foo = 'bar'


// 当一个模块需要导出单个成员的时候
// 直接给exports赋值是不管用的

// exports.a = 123
// exports = {}
// exports.foo = 'bar'
// module.exports.b = 'bar111'
// module.exports = 'enenene'



// 谁来require我，谁就得到module.exports
// 默认在代码的最后有一句return module.exports
// 一定要记住,最后return的是module.exports 不是exports,所以你给exports重新赋值不管用


// 练习
exports.foo = 'bar'  // {foo:bar}

module.exports.a = 123 // {foo:bar,a:123}

// exports !== module.exports 最终return的是module.exports
// 所以无论你exports中的成员是什么都没用
exports = {
    a: 456
}

module.exports.foo = 'haha' // {foo:haha,a:123}

exports.c = 456 // 没关系 混淆你的

// 重新建立了和module.exports之间的引用关系了
exports = module.exports

// 由于在上面建立了引用关系，所以这里是生效的
exports.a = 789 // {foo:haha,a:789}

// 前面再怎么牛逼，在这里全部重新赋值
// 最终得到的是function
module.exports = function() {
    console.log('hello')
}

// 真正去使用的时候不会这么绕
// 导出多个成员: exports.xxx = xxx
// 导出多个成员也可以 module.export = {

//  }
// 导出单个成员: module.exports




